import os
from PIL import Image
from glob import glob

# -------------------------- 可自定义配置 --------------------------
# 固定裁剪区域：(x1, y1, x2, y2)，即从左上角(40,40)裁剪到右下角(800,800)
FIXED_CROP_REGION = (0, 611, 1152, 1763)
# 裁剪后图片的保存目录（相对于脚本所在目录）
OUTPUT_DIR = "Meta40Pro裁剪"
# 支持的图片格式（可根据需要补充）
SUPPORTED_FORMATS = ("*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp")
# 是否覆盖已存在的裁剪后图片（True=覆盖，False=跳过）
OVERWRITE = True
# -------------------------------------------------------------------

def get_script_dir():
    """获取脚本所在的绝对目录"""
    return os.path.dirname(os.path.abspath(__file__))

def crop_single_image(input_path, output_path):
    """
    裁剪单张图片
    :param input_path: 输入图片路径
    :param output_path: 输出图片路径
    """
    # 跳过已存在的文件（若未开启覆盖）
    if os.path.exists(output_path) and not OVERWRITE:
        print(f"✅ 跳过（文件已存在）：{os.path.basename(input_path)}")
        return

    try:
        # 打开图片并获取原始尺寸
        with Image.open(input_path) as img:
            img_width, img_height = img.size
            x1, y1, x2, y2 = FIXED_CROP_REGION

            # 校验裁剪区域是否合法（避免超出原图尺寸）
            # 确保x2不超过图片宽度，y2不超过图片高度，且x1<x2、y1<y2
            x2 = min(x2, img_width)
            y2 = min(y2, img_height)
            x1 = max(x1, 0)
            y1 = max(y1, 0)
            
            if x1 >= x2 or y1 >= y2:
                print(f"❌ 裁剪区域无效（超出图片尺寸）：{os.path.basename(input_path)}（原图尺寸：{img_width}x{img_height}）")
                return

            # 执行裁剪并保存
            cropped_img = img.crop((x1, y1, x2, y2))
            cropped_img.save(output_path)
            print(f"✅ 裁剪完成：{os.path.basename(input_path)} → 裁剪后尺寸：{x2-x1}x{y2-y1}")

    except Exception as e:
        print(f"❌ 处理失败：{os.path.basename(input_path)} → 错误：{str(e)}")

def batch_crop_images():
    """批量裁剪脚本所在目录下的所有图片"""
    script_dir = get_script_dir()
    output_dir = os.path.join(script_dir, OUTPUT_DIR)

    # 创建输出目录（若不存在）
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"📂 已创建输出目录：{output_dir}")

    # 扫描脚本目录下所有支持格式的图片
    image_files = []
    for fmt in SUPPORTED_FORMATS:
        # 只扫描脚本目录下的图片，不递归子目录
        image_files.extend(glob(os.path.join(script_dir, fmt)))

    # 过滤掉输出目录中的图片（避免重复处理裁剪后的图片）
    image_files = [f for f in image_files if not f.startswith(output_dir)]

    if not image_files:
        print("⚠️  未在脚本目录下找到任何支持格式的图片")
        return

    # 批量处理每张图片
    print(f"\n🚀 开始处理（共 {len(image_files)} 张图片），裁剪区域：{FIXED_CROP_REGION}")
    for img_path in image_files:
        # 保持原文件名，保存到输出目录
        img_filename = os.path.basename(img_path)
        output_path = os.path.join(output_dir, img_filename)
        crop_single_image(img_path, output_path)

    print(f"\n🎉 全部处理完成！裁剪后的图片已保存至：{output_dir}")

if __name__ == "__main__":
    print("=====================================")
    print("         图片固定区域裁剪工具         ")
    print("=====================================")
    batch_crop_images()